home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FishMarket 1.0
/
FishMarket v1.0.iso
/
fishies
/
051-075
/
disk_069
/
conman
/
handler.asm
< prev
next >
Wrap
Assembly Source File
|
1992-05-06
|
4KB
|
107 lines
* === handler.asm ==========================================================
*
* Copyright (c) 1987 by William S. Hawes
*
* Distribute freely (but please leave the notice intact ...)
*
* ======================================================================
*
* This program functions as a "bootstrap loader" for DOS handler processes.
* It begins life as an ersatz-BCPL process, loaded automatically by DOS
* when your handler is opened. It opens your handler, created as
* a standard shared library, and then transfers to its main entry point.
*
* The main idea here is to allow handlers to be developed without going
* through the nonsense of creating BCPL-style modules. It is difficult
* even in assembler to get the module to look right -- it took numerous
* tries to get even this short program working. The basic problem is that
* every "hunk" created by your program must look like the BCPL model:
* preceded by a long-word count, and followed by the global vector table.
* The long-word count requires that you assemble the whole program at once
* to get the total size, which makes for some very long assembles.
*
* Even after your program looks right, the trouble is only beginning.
* Your code may look like BCPL, but the program libraries used in
* linking the handler may contribute hunks that aren't BCPL-ish.
* I got around this by including the EXEC library offset definitions in
* the include file "fix.i", so I don't even need Amiga.lib in my link.
*
* By developing the handler as standard shared library, you can work in
* a less ascetic development environment and still use DOS's automatic
* loading capabilites.
*
* One nice side-effect of building handlers this way is that the
* handler library can be unloaded by the system if memory gets tight.
* Each invocation of the handler opens and eventually closes the library,
* so the library can be swapped out if the handler isn't open at the time.
* This is partial compensation for the lack of proper DOS mechanisms to
* unload device handlers when they are no longer being used ...
* After assembling and linking this program, install it as a handler in the
* usual way (either by the MOUNT command or by patching the device node).
* Note that if a simple entry-point convention were adopted, this program
* could work for any handler, requiring only the name of the specific
* library to be opened. Why, there could even be a function called
* "OpenHandler" ... but then, no one get to use BCPL anymore.
*
* -- WSH (617) 568-8695
INCLUDE "chlib.i" ; definitions for your handler
INCLUDE "fix.i" ; offsets derived from "exec_lib.i"
INCLUDE "libraries/dos.i"
INCLUDE "libraries/dosextens.i"
_AbsExecBase EQU 4
CNOP 0,4
StartModule:
dc.l (EndModule-StartModule)/4
start: movea.l _AbsExecBase,a6
move.l d1,d4 ; save packet (BPTR)
lea CHLib(pc),a1 ; library name
moveq #CHLVERS,d0 ; version number
CALLSYS OpenLibrary
tst.l d0 ; opened?
beq.s CleanUp ; no??
movea.l d0,a5
; Call the console handler entry point
move.l d4,d1 ; startup packet
exg a5,a6
CALLSYS CHEntry
exg a5,a6
movea.l a5,a1
CALLSYS CloseLibrary
bra.s Exit
; Groan ... if we can't open the library, I can't even use the
; "ReturnPkt" function defined there ... must repeat it here.
CleanUp:
lsl.l #2,d4
movea.l d4,a0 ; DOS packet
clr.l dp_Res1(a0) ; FALSE return
clr.l dp_Res2(a0) ; use an error code, maybe?
movea.l dp_Link(a0),a1 ; EXEC message
movea.l dp_Port(a0),a0 ; replyport (??#@!)
CALLSYS PutMsg
Exit: rts
CHLib CHLNAME ; library name
CNOP 0,4
dc.l 0 ; end marker
dc.l 1 ; global defined
dc.l 4 ; offset
dc.l 1 ; maximum global
EndModule:
END